/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package fr.ul.ade.prime.analyzer;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.helpers.DefaultHandler;

import fr.ul.ade.prime.config.Config;
import fr.ul.ade.prime.exception.AAAException;
import fr.ul.ade.prime.exception.AAAParseException;

/**
 * Fournisseur de données.
 * 
 * @author Zanette Sébastien
 * @author Andrianjafintrimo Victor
 */
public abstract class ContainerData {

	@SuppressWarnings("unused")
	private static final String TAG = ContainerData.class.getSimpleName();

	protected ContainerData() {
		super();
	}

	public static ArrayList<FeedLesson> getFeedsLesson(String sessionId,
			String resource, int period) throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		ArrayList<FeedLesson> feeds = null;
		GregorianCalendar calendar = new java.util.GregorianCalendar();
		String start = new SimpleDateFormat("MM/dd/yyyy").format(calendar.getTime()); //$NON-NLS-1$
		calendar.add(Calendar.DATE, period);
		String end = new SimpleDateFormat("MM/dd/yyyy").format(calendar.getTime()); //$NON-NLS-1$
		String urlF = String.format(Config.URL_FEED_LESSON,
				sessionId,
				resource,
				start,
				end);
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing.
			 */
			DefaultHandler handler = new ParserLesson();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserLesson) handler).getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try

		fetcher.close();
		// On retourne l'array list
		return feeds;
	}

	public static ArrayList<FeedProject> getFeedsProject(String sessionId)
			throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		ArrayList<FeedProject> feeds = null;
		String urlF = String.format(Config.URL_FEED_PROJECT, sessionId);
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing.
			 */
			DefaultHandler handler = new ParserProject();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserProject) handler).getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try
		fetcher.close();
		// On retourne l'array list
		return feeds;
	}

	public static ArrayList<FeedResourceEtud> getFeedsResources(
			String sessionId, String numEtudiant) throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		ArrayList<FeedResourceEtud> feeds = null;
		String urlF = String.format(Config.URL_FEED_RESOURCE,
				sessionId,
				numEtudiant);
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing.
			 */
			DefaultHandler handler = new ParserResourceEtud();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupére directement la liste des feeds
			feeds = ((ParserResourceEtud) handler).getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try

		fetcher.close();
		// On retourne l'array list
		return feeds;
	}

	public static FeedConnection getFeedConnexion() throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		FeedConnection feed = null;
		String urlF = String.format(Config.URL_FEED_CONNEXION);
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing. On vera
			 * cette classe en détails ci aprés.
			 */
			ParserConnection handler = new ParserConnection();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupère directement la liste des feeds
			feed = handler.getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try

		fetcher.close();
		// On retourne le feed connexion
		return feed;
	}

	public static FeedConnection getFeedDeconnexion(String sessionId)
			throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		FeedConnection feed = null;
		String urlF = String.format(Config.URL_FEED_DECONNEXION, sessionId);
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing.
			 */
			DefaultHandler handler = new ParserConnection();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupére directement la liste des feeds
			feed = ((ParserConnection) handler).getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try

		fetcher.close();
		return feed;
	}

	public static FeedConnection getFeedSetProject(String sessionId,
			int projectId) throws AAAException {
		SAXParserFactory fabrique = SAXParserFactory.newInstance();
		SAXParser parseur = null;
		FeedConnection feed = null;
		String urlF = String.format(Config.URL_FEED_SET_PROJECT,
				sessionId,
				Integer.valueOf(projectId));
		XmlFetcher fetcher = null;

		try {
			parseur = fabrique.newSAXParser();
			fetcher = XmlFetcher.buildXmlFetcher(urlF);
			/*
			 * Le handler sera gestionnaire du fichier XML c'est à dire que
			 * c'est lui qui sera chargé des opérations de parsing.
			 */
			DefaultHandler handler = new ParserConnection();
			// On parse le fichier XML
			parseur.parse(fetcher, handler);
			// On récupére directement la liste des feeds
			feed = ((ParserConnection) handler).getData();
		} catch (Exception e) {
			throw new AAAParseException(e, fetcher);
		}// try

		fetcher.close();
		return feed;
	}

}// class ContainerData